package com.anita.member.domain.repository;

import com.anita.member.domain.model.member.*;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 会员仓储接口
 * 定义会员聚合根的持久化操作
 * @author qiu
 * @date 2025/10/17
 * @description
 */
public interface MemberRepository {

    /**
     * 保存会员聚合根（新增或更新）
     * @param member 会员聚合根
     * @return 保存后的会员
     */
    Member save(Member member);

    /**
     * 根据ID查找会员
     * @param id 会员ID
     * @return 会员可选对象
     */
    Optional<Member> findById(MemberId id);

    /**
     * 根据用户名查找会员
     * @param username 用户名
     * @return 会员可选对象
     */
    Optional<Member> findByName(Username username);

    /**
     * 根据手机号查找会员
     * @param phone
     * @return
     */
    Member findByPhone(Phone phone);

    /**
     * 根据邮箱查找会员
     * @param email
     * @return
     */
    Member findByEmail(Email email);

    /**
     * 验证用户名是否存在
     * @param username
     * @return
     */
    boolean existsByUsername(Username username);

    /**
     * 验证手机号是否存在
     * @param phone
     * @return
     */
    boolean existsByPhone(Phone phone);

    /**
     * 验证邮箱是否存在
     * @param email
     * @return
     */
    boolean existsByEmail(Email email);

    /**
     * 删除会员
     * @param member
     */
    void delete(Member member);

    /**
     * 分页查询会员
     * @param current 当前页码
     * @param size 每页大小
     * @param username 用户名
     * @param phone 手机号
     * @param email 邮箱
     * @param deletedAt 删除时间
     * @return 分页结果
     */
    PageResult<Member> findPage(int current, int size, String username, String phone, String email, LocalDateTime deletedAt);

    /**
     * 分页结果封装类
     * @param <T> 数据类型
     */
    interface PageResult<T> {
        List<T> getRecords();
        long getTotal();
        long getCurrent();
        long getSize();
        long getPages();
        boolean hasNext();
        boolean hasPrevious();
    }
}
